#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/*
	struct dirent *readdir(DIR *dirp);

		功能：读取一个目录
		    
		一个目录下可能有多个目录项，每调用一次只获取一个目录项，直到返回值为NULL
		参数：
		    
		dirp：指定要读取的目录的目录指针
		    
		返回值：
		struct dirent * 目录项指针
		    
		成功，返回一个目录项指针
		读完了，返回NULL
		    
		失败，返回NULL，同时errno被设置

	struct dirent 
	{
		ino_t          d_ino;       /* inode节点的编号 
		off_t          d_off;       /* 目录项的偏移量 
		unsigned short d_reclen;    /* 该结构体的长度 
		unsigned char  d_type;      /* 该目录项指向的文件的类型 
	    
		DT_BLK      This is a block device. 			这是一个块设备文件
		DT_CHR      This is a character device.			这是一个字符设备文件
		DT_DIR      This is a directory.			    这是一个目录	
		DT_FIFO     This is a named pipe (FIFO).		这是一个命名管道(FIFO)。
		DT_LNK      This is a symbolic link.			这是一个符号链接。文件
		DT_REG      This is a regular file.				这是一个普通文件。
		DT_SOCK     This is a UNIX domain socket.		这是一个套接字文件
		DT_UNKNOWN  The file type could not be determined.无法确定文件类型。
							
		char           d_name[256]; /* 该目录项指针指向的文件的文件名（不带路径） 
	};


	

*/


void show_type_of_same_file_name(char *pathname,char *savefile,char *typename)
{
	/*
	FILE *save;
	char ch;
	if((save=fopen(savefile,'w+'))==NULL)
	{
		printf("fopen %s error!\n",savefile);
		exit(0);
	}
	*/

	int fd = open(savefile,  O_RDWR | O_CREAT | O_TRUNC);
	if(fd == -1)
	{
		perror("open failed ");
		exit(0);
	}				
	
	//功能：切换当前的工作目录
	//chdir(pathname);
	
	//1.打开目录
	//struct dirent *dir;
	DIR *dirp = opendir(pathname);
	if(dirp==NULL) 
	{
		perror("open dir error!");
		exit(0);
	}
	//2.不断地 读取目录项
	struct dirent *dir;
	while(dir = readdir(dirp))
	{
		//过滤掉 . 和 .. 
		if(!strcmp(dir->d_name,".") || !strcmp(dir->d_name,"..") )
		{
			continue;
		}
		if(dir->d_type == DT_REG)		//如果这是一个普通文件。
		{
			char sFilename[1280]={0};
			strcpy(sFilename,dir->d_name);
			sFilename[strlen(sFilename)]='\0';
			char *pFile;
			//strrchr 函数在字符串 s 中是从后到前（或者称为从右向左）
			//查找字符 c，找到字符 c 第一次出现的位置就返回，返回值指向这个位置
			//如果未找到字符 c，则返回 NULL
			pFile=strrchr(sFilename,'.');
			if(pFile!=NULL)
			{
				//判断是否是输入的文件
				if(strcmp(pFile,typename)==0)
				{
					printf("\n");
					printf("%s\n",sFilename);//打印到屏幕
					sprintf(sFilename,"%s\n",sFilename);//输出换行符到sFilename
					write(fd,sFilename,strlen(sFilename));//输出到文件
				}
			}
		}
		if(dir->d_type==DT_DIR)
		{
			show_type_of_same_file_name(pathname,savefile,typename);
		}
	}
	//关闭文件
	close(fd);
	//3.关闭目录
	closedir(dirp);
	
}

int main()
{
	char savefile[50];
	char pathname[50];
	char FiletTpeName[10];
	printf("please input filename which you want to save:\n");
	scanf("%s",savefile);
	printf("please input directory:\n");
	scanf("%s",pathname);
	printf("please input File type:\n");
	scanf("%s",FiletTpeName);
	show_type_of_same_file_name(pathname,savefile,FiletTpeName);

	
	return 0;
}

